package com.cskaoyan.javase.annotation._2use;

import sun.util.resources.cldr.es.CalendarData_es_PY;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

/**
 * 注解的使用
 * 注解在使用的时候,也需要先实例化这个注解
 * 但是注解的实例化有特殊的语法,它不使用"new"关键字,而是用:
 * _@注解名(要给注解体当中的每一个属性赋值)
 * 不能漏掉任何一个
 * 赋值时,用字面值常量赋值,静态常量赋值(指的是Class类型)
 * 不能用new对象的形式(引用数据类型的属性)
 *
 * 注解在实例化时,写在什么位置呢?
 * 注解相当于给代码结构添加上额外信息,所以注解一定要修饰一定的代码结构
 * 比如修饰整个类,整个方法,成员变量,构造器...
 *
 * 元注解的概念,用来解释注解的注解就是元注解,它一般放在注解定义的头上
 * _@Target,作用是定义注解可以修饰的目标，如果一个注解没有用该注解标明可修饰的目标，那么就表示该注解可以修饰任意结构，没有限制。
 *
 * 该注解的常见取值如下：
 * 整个类    ElementType.TYPE
 * 成员变量   ElementType.FIELD
 * 构造方法   ElementType.CONSTRUCTOR
 * 成员方法   ElementType.METHOD
 *
 * 注意事项/细节问题:
 *      1.如果注解体当中只有一个属性,且这个属性叫value,那么在赋值时,可以直接不用写"属性名="
 *          可以直接赋值
 *      2.注解体当中的属性可以直接指明默认值,使用关键字"default 取值",直接写在注解属性定义的后面
 *          属性有默认值后,就不需要强制指定了,当然也仍然可以指定,会覆盖默认值
 *
 * @since 10:00
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {

}

@AnnotationA(a = 100, b = 0.1, c = "abc", d = {1, 2, 3}, e = {"abc", "efg"}, f = int.class)
class A {
    @AnnotationA(a = 100, b = 0.1, c = "abc", d = {1, 2, 3}, e = {"abc", "efg"}, f = int.class)
    int num;

    @AnnotationA(a = 100, b = 0.1, c = "abc", d = {1, 2, 3}, e = {"abc", "efg"}, f = int.class)
    public A() {
    }

    @AnnotationA(a = 100, b = 0.1, c = "abc", d = {1, 2, 3}, e = {"abc", "efg"}, f = int.class)
    public void test() {
    }
}

@AnnotationB(300)
class B {

}


@interface AnnotationB {
    int value() default 100;

}

// 注解
@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.METHOD})
@interface AnnotationA {
    int a();

    double b();


    String c();

    int[] d();

    String[] e();

    Class f();
}